#include<linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include<linux/fs.h>
#include<linux/slab.h>
#include<linux/timer.h>//timer_list
#include <linux/sched.h>//jiffies
#include <linux/list.h>//container_of

MODULE_AUTHOR("Tan xujia");
MODULE_LICENSE("Dual BSD/GPL");

struct timertest {
    struct timer_list mytimer;
    int count;
    int delay;
}ttest;

/*在指定回调函数时，并没有给回调函数的实参，
这里的t应该是系统在调用的会传入对应的timer_list，
比如这里是ttest.mytimer*/
void
timer_callback(struct timer_list *t)
{
    printk("timer_callback\n");
    struct timertest *p = container_of(t, struct timertest, mytimer);
    if(--(p->count)) {
        /*如果没有这个，那么回调函数只会进入一次，
        在调用的时候可以改变回调函数的执行时间*/
        mod_timer(t, jiffies+p->delay);
    }
    else {
        printk("timer_callback del\n");
        /*也可以在模块退出时删除*/
        del_timer(t);
    }
    return;
}

static
int __init hello_init (void)
{
    printk("hello_init\n");
    ttest.count = 10;
    ttest.delay = 100;
    timer_setup(&ttest.mytimer, &timer_callback, 0);
    mod_timer(&ttest.mytimer, jiffies+ttest.delay);
    return 0;
}

static
void __exit hello_exit (void)
{
    //del_timer(&&ttest->mytimer);
    printk("hello_exit\n");
}

module_init(hello_init);
module_exit(hello_exit);